home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 January - Disc 2 / Macworld (1999-01) (Disk 2).dmg / Serious Demos / Symbolic Composer 4.2 / Environment / System / DEF / Utilities / Supplements / Motives&Methods < prev    next >
Text File  |  1998-10-23  |  14KB  |  440 lines

  1. Motives & Methods
  2.  
  3. Instead of processing classes separately (which gives you the maximum freedom), there are occasions when you want to process bigger musical chunks. These are called motives.
  4.  
  5. A motive operates on a single, or multiple zone lists. A motive is a collection of classes:
  6.  
  7. symbol length velocity channel program controller duration groove tonality zone tuning
  8.  
  9. It may contain only one class, or multiple classes. Motive has a name and its definition follows an optional motive-tree inheritation. A motive can be operated as a whole, or applying symbol and vector processors to its classes. Finally motives are connected to sections and instruments.
  10.  
  11. This defines a motive tree which (if defined) is used for inheritance.
  12.  
  13. (def-motive-tree 'my-set
  14.   all (name1 group name2)
  15.   group (more1 more2 more3)
  16. )
  17.  
  18. This defines now all motives to consist of same values.
  19.  
  20. (def-motive all
  21.   length '(1/16 1/8)
  22.   symbol '(a b c)
  23.   velocity '(10 20 30)
  24.   duration '(1/16. 1/8.)
  25. )
  26.  
  27. Now you can define groups in motive tree to have different values.
  28.  
  29. (def-motive group
  30.   length '(1/4)
  31.   symbol '(d)
  32. )
  33.  
  34. Now
  35.  
  36. (motive name1 symbol) ; and name2
  37. --> (a b c)
  38. (motive name1 velocity)
  39. --> (10 20 30)
  40.  
  41. (motive more1 symbol) ; and more2, more3
  42. --> (d)
  43. (motive more1 velocity)
  44. --> (10 20 30)
  45.  
  46. Motives defined in a tree are stored in atoms. Each atom in the motive tree will now contain a motive object .
  47.  
  48. more1
  49. --> #<motive #x5A5D91>
  50.  
  51. Note: If necessary inheritation tree can be changed with inherit-motive.
  52.  
  53. (inherit-motive another-set)
  54.  
  55. Clearing values
  56.  
  57. To clear motive values in a tree from a given group use
  58.  
  59. (clear-motive-tree 'my-set 'group)
  60.  
  61. That will clear all motives and submotives etc found on 'group in motive-tree 'my-set.
  62.  
  63. Connection to Sections
  64.  
  65. Motives can connect to sections in two ways, by single class or as a whole. 
  66.  
  67. Using Single Class
  68.  
  69. To connect a single class of a motive to a section class use list to build up zoned material, or use it directly. Motive is accesses with motive.
  70.  
  71. (motive more1 symbol) (a b c)
  72. (motive more1 duration) (1/16. 1/8.)
  73. (motive more1 program) nil
  74.  
  75. In def-section context the class can be omitted. Motive references withing a section sect-are written this way. Here each motive is a single zone motive. If motive contains multiple zones the results can be used as usual.
  76.  
  77. (def-section sect-a
  78.   piano
  79.      symbol (list (motive more1)      ; each zone has its own material
  80.                     (motive more2)
  81.                   (motive more3))
  82.   bass 
  83.      symbol (motive more1)            ; goes through zones
  84.   synth 
  85.      symbol (list (motive more1))     ; restarts at each zone
  86. )
  87.    
  88. (same-as symbol of piano in sect-a) ((a b c) (a b c) (a b c))
  89. (same-as symbol of bass in sect-a) (a b c)
  90. (same-as symbol of synth in sect-a) ((a b c))
  91.  
  92. Using Whole Motives
  93.  
  94. Whole motives can be directly connected to sections using motive instead of class. It one motive is supplied, then motive output is a single list (..). If list is used, then each output is a double list ((..)). If there are multiple motives the output is a zone list ((..) (..) ..  (..)).
  95.  
  96. (def-section sect-a
  97.   default
  98.      zone '(1/1)
  99.   piano1 
  100.      motive name1                     ; motive goes through zones           
  101.   piano2 
  102.      motive (list name1)              ; motive restarts at each zone
  103.   piano3 
  104.      motive (list more1 more2 more3)  ; uses a motive in each zone
  105. )
  106.  
  107. (same-as symbol of piano1 in sect-a) (a b c)
  108. (same-as symbol of piano2 in sect-a) ((a b c))
  109. (same-as symbol of piano3 in sect-a) ((a b c) (a b c) (a b c))
  110.  
  111. MultiZone Motives
  112.  
  113. A motive can as well has multiple zone material.
  114.  
  115. (def-motive multi
  116.   length '((1/16 1/8))
  117.   symbol '((a b c) (e f g))
  118.   velocity '(10 20 30)
  119.   duration '(1/16. 1/8.)
  120. )
  121.  
  122. MultiZone motives can be connected in the same way as single zone motives, but since they already contain multiple zones, the result of the (list multi) will be the same as multi. In case of multiple motives (list multi multi multi) they are appended like with the ++ operation.
  123.  
  124. (def-section sect-a
  125.   piano1 
  126.      motive multi                              
  127.   piano2 
  128.      motive (list multi)
  129.   piano3 
  130.      motive (list multi multi multi)
  131. )
  132.  
  133. (same-as symbol of piano1 in sect-a) ((a b c) (e f g))
  134. (same-as symbol of piano2 in sect-a) ((a b c) (e f g))
  135. (same-as symbol of piano3 in sect-a) ((a b c) (e f g) (a b c) (e f g) (a b c) (e f g))
  136.  
  137. Motive Definition within Sections
  138.  
  139. Motives can also be defined directly within sections, and the motives become accessible for other instruments and motive operators.
  140.  
  141. (def-section sect-a
  142.   piano1 
  143.      motive (def-motive theme
  144.                length '((1/16 1/8))
  145.                symbol '((a b c) (e f g))
  146.                velocity '(10 20 30)
  147.                duration '(1/16. 1/8.))                              
  148.   piano2 
  149.      motive (rev theme)
  150.   piano3 
  151.      motive (tran theme 1)
  152. )
  153. (same-as symbol of piano1 in sect-a) ((a b c) (e f g))
  154. (same-as symbol of piano2 in sect-a) ((g f e) (c b a))
  155. (same-as symbol of piano3 in sect-a) ((b c d) (f g h))
  156.  
  157. (same-as duration of piano1 in sect-a) (1/16. 1/8.)
  158. (same-as duration of piano2 in sect-a) (1/8. 1/16.)
  159. (same-as duration of piano3 in sect-a) (1/16. 1/8.)
  160.  
  161. Whole motives as section defaults
  162.  
  163. <select reset scom>
  164.  
  165. (def-motive test
  166.   length '(1/32)
  167.   symbol '(a)
  168.   velocity '(10)
  169.   duration '(1/32)
  170. )
  171.  
  172. (def-section sect-a
  173.   default
  174.      motive test
  175.   piano
  176.      symbol '(-a -b c)
  177.   bass
  178.      symbol '(e f g)
  179. )
  180.  
  181. (same-as symbol of piano in sect-a) (-a -b c)
  182. (same-as length of piano in sect-a) (1/32)
  183.  
  184. (same-as symbol of bass in sect-a) (e f g)
  185. (same-as velocity of bass in sect-a) (10)
  186.  
  187. Or using motives as defaults
  188.  
  189. (def-section sect-a
  190.   default
  191.      motive (def-motive theme
  192.                length '((1/16 1/8))
  193.                symbol '((a b c) (e f g))
  194.                velocity '(10 20 30)
  195.                duration '(1/16. 1/8.))
  196.      zone '(1/1 2/1)
  197.   piano
  198.      symbol '(-a -b c)
  199.   bass
  200.      symbol '(e f g)
  201. )
  202.  
  203. Mixing whole motives and motive classes
  204.  
  205. If you need to connect motives differently, use the combination of connect and single motive definitions. Here 3 motives define material for 3 zones, but the velocity uses only a single list of values from the first motive.
  206.  
  207. (def-section sect-a
  208.   bass 
  209.     motive (list more1 more2 more3)  
  210.     velocity (motive name1) 
  211. )
  212.  
  213. (same-as symbol of bass in sect-a) ((a b c) (a b c) (a b c))
  214. (same-as velocity of bass in sect-a) (10 20 30)
  215.  
  216. Motives with Zones and Tonalities
  217.  
  218. (def-section sect-a
  219.   default 
  220.      motive (def-motive theme
  221.               tonality (activate-tonality (augmented2 c 4) (augmented2 g 4))
  222.               zone '(1/1 2/1 3/1)
  223.               length '((1/16 1/8))
  224.               symbol '((a b c) (e f g))
  225.               velocity '(10 20 30)
  226.               duration '(1/16. 1/8.))                             
  227.   piano2 
  228.      motive (rev theme)
  229.   piano3 
  230.      motive (tran theme 1)
  231. )
  232.  
  233. Motive Operations
  234.  
  235. There are some predefined motive operations which replicate the most common symbol processors. A mechanism for applying any symbol or vector processor to motives is further provided.
  236.  
  237. Shifting
  238.  
  239. (setq new (>> more1 '1/16))
  240. (motive new groove)
  241.  
  242. (setq new (>> more1 '-1/16))
  243. (motive new groove)
  244.  
  245. Appending
  246.  
  247. (setq new (++ more1 more2 more3))
  248. (motive new symbol) (a b c a b c a b c)
  249. (motive new velocity) (10 20 30 10 20 30 10 20 30)
  250.  
  251. (setq new (++ more1 (>> more1 '-1/16) (>> more1 '1/16)))
  252. (motive new groove) 
  253. (motive new velocity) 
  254.  
  255. (>> (++ more1 more2) '1/16)
  256.  
  257. Stretching
  258.  
  259. (setq new (** name1 1.5)) ; stretches both note lengths and durations
  260. (motive name1 length) (1/16 1/8)
  261. (motive name1 duration) (1/16. 1/8.)
  262. (motive new length) (3/32 3/16)
  263. (motive new duration) (9/64 9/32)
  264.  
  265. Transposing
  266.  
  267. (setq new (tran more1 1))
  268. (motive more1 symbol) (a b c)
  269. (motive new symbol) (b c d)
  270.  
  271. Inverting
  272.  
  273. (setq new (inv more1 'a))
  274. (motive more1 symbol) (a b c)
  275. (motive new symbol) (a -b -c)
  276.  
  277. Reversing
  278.  
  279. (setq new (rev more1))
  280. (motive more1 symbol) (a b c)
  281. (motive new symbol) (c b a)
  282. (motive more1 velocity) (10 20 30)
  283. (motive new velocity) (30 20 10)
  284.  
  285. Legatoing
  286.  
  287. (setq new (leg more1 10))
  288. (motive more1 duration) (1/16. 1/8.)
  289. (motive new duration) (15/16 15/8)
  290.  
  291. Zoning
  292.  
  293. (def-section sect-a
  294.   piano 
  295.      motive (list more1 more2 more3) 
  296.      zone (zone more1 more2 more3)
  297. )
  298.  
  299. (same-as zone of piano in sect-a) (3/16 3/16 3/16)
  300. (same-as length of piano in sect-a) ((1/16 1/8) (1/16 1/8) (1/16 1/8))
  301.  
  302. More Motive Operations: app & com 
  303.  
  304. app: Applying Function to Motives  
  305.  
  306. Examples:
  307.  
  308. Transposing motive
  309.  
  310. (setq new (app name1 'symbol '(symbol-transpose 1 x)))
  311. (motive new symbol)
  312.  
  313. Changing motive's length
  314.  
  315. (setq new (app name1 'length '(change-length :times 1.5 x :ratio)))
  316.  
  317. (motive name1 length) (1/16 1/8)
  318. (motive new length) (3/32 3/16)
  319.  
  320. Scrolling lengths
  321.  
  322. (setq new (app name1 'length '(symbol-scroll 1 x)))
  323. (motive name1 length) (1/16 1/8)
  324. (motive new length) (1/8 1/16)
  325.  
  326. Making motive play legato (each note plays 5 times longer)
  327.  
  328. (setq new (app name1 'duration '(change-length :times 5 x :ratio)))
  329. (motive name1 duration)
  330. (motive new duration)
  331.  
  332. com: Combining Motives
  333.  
  334. com makes a duplicate of the motive and enables to change one or more classes while doing that. Here symbol-mix is applied to motive name1 and name2 symbols and the result is combined with other motive classes from more1.
  335.  
  336. (setq mixed-motiv
  337.       (com more1 :symbol (symbol-mix (motive name1 symbol)
  338.                                      (reverse (motive name2 symbol)))))
  339.  
  340. Operations within Sections
  341.  
  342. Operations can be performed within sections. Here is a summary of different ways to connect motives to sections and instruments.
  343.  
  344. (def-section sect-a
  345.   piano1                              ; motive goes through zones 
  346.      motive name1                                      
  347.   piano2                              ; motive restarts at each zone
  348.      motive (list name1)              
  349.   piano3                              ; uses a motive in each zone
  350.      motive (list more1 more2 more3)  
  351.   piano4                              ; motive goes through zones
  352.      motive (rev more1)               
  353.   piano5                              ; motive restarts at each zone
  354.      motive (list (rev more1))        
  355.   piano6                              ; uses a motive in each zone
  356.      motive (list (rev more1) (rev more1) (rev more1)) 
  357. )
  358.  
  359. (same-as symbol of piano1 in sect-a) (a b c)
  360. (same-as symbol of piano2 in sect-a) ((a b c))
  361. (same-as symbol of piano3 in sect-a) ((a b c) (a b c) (a b c))
  362. (same-as symbol of piano4 in sect-a) (c b a)
  363. (same-as symbol of piano5 in sect-a) ((c b a))
  364. (same-as symbol of piano6 in sect-a) ((c b a) (c b a) (c b a))
  365.  
  366. All other motive classes have the same structure, naturally.
  367.  
  368. Programming Motive Methods
  369.  
  370. New motive methods (functions that operate only with motives) are easy to define with defmethod. Use mlength, msymbol etc to refer to the same source motive, and use symbol and vector processors for required operation. The idea here is to make a new motive by copying the source elements and process them. Notice the test is-flat. This is needed since the motive can contain both single zone material or multiple zone material. If it is a multizone then each sublist must be processed with mapcar.
  371.  
  372. (defmethod mymet ((source motive) amount)
  373.   (make-instance 'motive
  374.     :symbol (msymbol source)                ; this copies directly
  375.     :length (if (is-flat (mlength source))  ; this changes
  376.               (change-length :times amount (mlength source) :ratio)
  377.               (mapcar #'(lambda (x) (change-length :times amount x :ratio))
  378.                       (mlength source))) 
  379.     :velocity (mvelocity source)
  380.     :channel (mchannel source)
  381.     :program (mprogram source)
  382.     :controller (mcontroller source)
  383.     :duration (mduration source)
  384.     :groove (mgroove source)
  385.     :tuning (mtuning source)
  386.     :zone (mzone source)
  387.     :tonality (mtonality source)))
  388.  
  389. (setq new (mymet more1 10))
  390. (motive more1 length)
  391. (motive new length)
  392.  
  393. Multiple Operations
  394.  
  395. Programmable methods make it possible to wrap several  functions to process multiple classes at once. For example, it is now easy to create methods which filter symbols, amplify velocities, and process grooves at the same time for the whole motive. The method is then applicable to all motives.
  396.  
  397. (defmethod newmet ((source motive) amount)
  398.   (make-instance 'motive
  399.     :symbol (if (is-flat (msymbol source))
  400.               (filter-delete '(a) (msymbol source))
  401.               (mapcar #'(lambda (x) (filter-delete '(a) x)) (msymbol source)))
  402.     :length (if (is-flat (mlength source))
  403.               (change-length :times amount (mlength source) :ratio)
  404.               (mapcar #'(lambda (x) (change-length :times amount x :ratio))
  405.                       (mlength source)))
  406.     :velocity (if (is-flat (mvelocity source))
  407.                 (vector-amplify 1.5 (mvelocity source))
  408.                 (mapcar #'(lambda (x) (vector-amplify 1.5 x))
  409.                         (mvelocity source)))
  410.     :channel (mchannel source)
  411.     :program (mprogram source)
  412.     :controller (mcontroller source)
  413.     :duration (if (is-flat (mduration source))
  414.               (change-length :times amount (mduration source) :ratio)
  415.               (mapcar #'(lambda (x) (change-length :times amount x :ratio))
  416.                       (mduration source)))
  417.     :tuning (mtuning source)
  418.     :groove (mgroove source)
  419.     :zone (mzone source)
  420.     :tonality (mtonality source)))
  421.  
  422. (def-motive test
  423.   length '((1/16 1/8))
  424.   symbol '((a b c) (e f g) (a b c))
  425.   velocity '(10 20 30)
  426.   duration '(1/16. 1/8.)
  427. )
  428.  
  429. (setq new (newmet test 10))
  430. (motive new symbol) ((= b c) (e f g) (= b c))
  431.  
  432. Naming Conventions
  433.  
  434. There are some differences in naming conventions here.
  435.  
  436. * Motive method call starts always with the motive name, and then the parameters follow.
  437.  
  438. * Motive method names should be one-part name, which are easy to memorize. This way methods are also easier to recognize from the usual functions and macros.
  439.  
  440.